﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dominio;
using System.Data.Objects;
using Excepciones;

namespace Servicios
{
    public class BusquedaServiceDataBaseImpl : GenericService<Busqueda>, IBusquedaService
    {
        private static BusquedaServiceDataBaseImpl instancia = new BusquedaServiceDataBaseImpl();

        private BusquedaServiceDataBaseImpl() : base() { }

        public static BusquedaServiceDataBaseImpl ObtenerInstancia() {
            return instancia;
        }

        protected override ObjectSet<Busqueda> GetObjectSet(DominioContainer ctx)
        {
            return ctx.Busquedas;
        }

        public Busqueda ObtenerPorId(int id)
        {
            using (DominioContainer ctx = new DominioContainer())
            { 
                try
                {
                    Busqueda busqueda = ctx.Busquedas.First(b => b.Id == id);
                    return busqueda;
                }
                catch (Exception ex)
                {
                    throw new DataBaseException();
                }
            }
        }

        public void Modificar(Busqueda t)
        {
            using (DominioContainer ctx = new DominioContainer())
            {
                Busqueda bus = null;
                try
                {
                    bus = ctx.Busquedas.First(b => b.Id == t.Id);
                }
                catch (Exception ex)
                {
                    throw new DataBaseException("Busqueda no existente en la base de datos.");
                }
                if (bus == null)
                {
                    throw new DataBaseException("No existe una busqueda con id " + bus.Id + " en la base de datos.");
                }
                bus.Keyword = t.Keyword;
                bus.Cantidad = t.Cantidad;
                bus.Usuario = t.Usuario;
                ctx.SaveChanges();
            }
        }


        public IList<Busqueda> ObtenerBusquedasDelUsuario(int idUsuario)
        {
            using (DominioContainer ctx = new DominioContainer())
            {
                IList<Busqueda> busquedasDelUsuario = new List<Busqueda>();

                try
                {
                    var query = from bus in ctx.Busquedas
                                where bus.Usuario.Id == idUsuario
                                orderby bus.Cantidad descending
                                select bus;

                    foreach (var busqueda in query)
                    {
                        Usuario u = busqueda.Usuario;
                        busqueda.Usuario = u;
                        busquedasDelUsuario.Add(busqueda);
                    }
                    return busquedasDelUsuario;
                }
                catch (Exception ex)
                {
                    throw new DataBaseException();
                }
            }
        }

        public override void Registrar(Busqueda t)
        {
            using (DominioContainer ctx = Ctx)
            {
                Usuario usu = ctx.Usuarios.First(u => u.Id == t.Usuario.Id);
                Busqueda busquedaExistente = null;
                try{
                    busquedaExistente = ctx.Busquedas.First(b => b.Keyword == t.Keyword && b.Usuario != null && b.Usuario.Id == usu.Id);
                }catch(Exception ex){
                    //No existe la busqueda
                }
                if (busquedaExistente == null)
                {
                    Busqueda b = new Busqueda();
                    b.Keyword = t.Keyword;
                    b.Usuario = usu;
                    b.Cantidad = 1;
                    base.Registrar(b);
                }
                else
                {
                    busquedaExistente.Cantidad++;
                    ctx.SaveChanges();
                }
            }
        }

        public override void Borrar(Busqueda t)
        {
            /*using (DominioContainer ctx = Ctx)
            {
                Busqueda bus = ctx.Busquedas.First(b => b.Id == t.Id);
                base.Borrar(bus);
            }*/
            base.Borrar(t);
        }
    }
}
